﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
using DataAccess;

namespace BusinessLogic
{
    public class Persona
    {
        #region ATRIBUTOS

        long _NroFuncionario;
        string _Mail;
        string _Nombre;
        string _Apellido;
        string _Telefono;
        string _Interno;
        string _Seccion;
        string _Contrasenia;
        bool _Activo;

        #endregion

        #region PROPERTIES

        public long NroFuncionario
        {
            get { return _NroFuncionario; }
            set { _NroFuncionario = value; }
        }

        public string Mail
        {
            get { return _Mail; }
            set { _Mail = value; }
        }

        public string Nombre
        {
            get { return _Nombre; }
            set { _Nombre = value; }
        }

        public string Apellido
        {
            get { return _Apellido; }
            set { _Apellido = value; }
        }

        public string Telefono
        {
            get { return _Telefono; }
            set { _Telefono = value; }
        }

        public string Interno
        {
            get { return _Interno; }
            set { _Interno = value; }
        }

        public string Seccion
        {
            get { return _Seccion; }
            set { _Seccion = value; }
        }

        public string Contrasenia
        {
            get { return _Contrasenia; }
            set { _Contrasenia = value; }
        }

        public bool Activo
        {
            get { return _Activo; }
            set { _Activo = value; }
        }

        #endregion

        #region CONSTRUCTORES

        public Persona() { }

        public Persona(long pNro, string pMail, string pNom, string pAp, string pTel, string pInt, string pSec, string pCont)
        {
            _NroFuncionario = pNro;
            _Mail = pMail;
            _Nombre = pNom;
            _Apellido = pAp;
            _Telefono = pTel;
            _Interno = pInt;
            _Seccion = pSec;
            _Contrasenia = pCont;
        }

        #endregion

        #region METODOS

        //Inserta un funcionario. Utiliza el metodo especifico de cada clase especializada.
        public void insert()
        {
           string tipo = this.GetType().ToString();
           if(tipo == "BusinessLogic.Administrador")
           {
               Administrador a = Administrador.Parse(this);
               a.addAdministrador();
           }
            else if(tipo == "BusinessLogic.Tecnico")
           {
               Tecnico t = Tecnico.Parse(this);
               t.addTecnico();
           }
           else if (tipo == "BusinessLogic.Supervisor")
           {
               Supervisor s = Supervisor.Parse(this);
               s.addSupervisor();
           }
           else if (tipo == "BusinessLogic.Usuario")
           {
               Usuario u = Usuario.Parse(this);
               u.addUsuario();
           }
        }
        public void update()
        {
            ControllerPersona.getInstancia().updatePersona((Int32)this.NroFuncionario, this.Nombre, this.Apellido, this.Telefono, this.Interno, this.Mail, this.Seccion, this.Contrasenia);
        }
        //Parsear una datatable conteniendo los datos de un funcionario a un objeto del tipo Persona.
        public static List<Persona> parseRegToPersona(DataTable pTable)
        {
            //Recibe como parametro una data table con los registros correspondientes a una o mas
            //personas y devuelve una lista de objetos "persona".
            List<Persona> lstPer = new List<Persona>();

            //Se recorre la tabla.
            for (int i = 0; i < pTable.Rows.Count; i++ )
            {
                //Se crea una nueva instancia de la clase Persona.
                Persona unaP = new Persona();
                unaP.NroFuncionario = long.Parse(pTable.Rows[i]["pernrofuncionario"].ToString());
                unaP.Nombre = pTable.Rows[i]["pernombre"].ToString();
                unaP.Apellido = pTable.Rows[i]["perapellido"].ToString();
                unaP.Telefono = pTable.Rows[i]["pertelefono"].ToString();
                unaP.Interno = pTable.Rows[i]["perinterno"].ToString();
                unaP.Mail = pTable.Rows[i]["permail"].ToString();
                unaP.Seccion = pTable.Rows[i]["perseccion"].ToString();
                unaP.Contrasenia = pTable.Rows[i]["percontrasenia"].ToString();
                unaP.Activo = bool.Parse(pTable.Rows[i]["peractivo"].ToString());
                //Se agrega la persona a la lista.
                lstPer.Add(unaP);
            }
            return lstPer; 
        }

        //Dar de baja logica un Funcionario.
        public void deleteFuncionario()
        {
            ControllerPersona.getInstancia().cambiarEstadoFuncionario((Int32)this.NroFuncionario, false);
        }

        //Activar un Funcionario.
        public void activarFuncionario()
        {
            ControllerPersona.getInstancia().cambiarEstadoFuncionario((Int32)this.NroFuncionario, true);
        }

        //Verifica el funcionario y devuelve el tipo especifico dentro del tipo Persona.
        public static Persona verificarFuncionario(long pNro, string pCont)
        {
            //Se declara una instancia de la clase Persona que se devolvera con el funcionario logueado.
            Persona unaP = null;
            //Primero se verificar que el funcionario haya ingresado correctamente la contraseña y este activo.
            Int32 id = ControllerPersona.getInstancia().getIdFuncByNroAndCont((Int32)pNro, pCont, true);
            //Si es asi, se le asigna a unaP una instancia del funcionario especifico con los detalles correspondientes.
            unaP = getFuncionarioEspecificoByNro(id);
            //Se retorna la instancia de Persona creada.
            return unaP;
        }

        //Dar funcionario especificado por Numero de funcionario.
        public static Persona getFuncionarioEspecificoByNro(long pNro)
        {
            Persona unF = Administrador.getAdministradorByNro(pNro);
            if(unF == null)
            {
                unF = Supervisor.getSupervisorByNro(pNro);
                if(unF == null)
                {
                    unF = Tecnico.getTecnicoByNro(pNro);
                    if(unF == null)
                    {
                        unF = Usuario.getUsuarioByNro(pNro);
                    }
                }
            }
            return unF;
        }
        //Dar lista de funcionarios por su estado. Devuelve todos los datos de los funcionarios inclusive su rol.
        public static DataTable getListFuncByEstado(bool pEst)
        {
            return ControllerPersona.getInstancia().getFuncionariosByEstado(pEst);
        }
        #endregion
    }
}
